package com.zed.api.games;

import java.util.List;

/**
 * 游戏关卡,也可以理解成一个游戏场景,目前该类不支持序列化,后续看情况放开
 *
 * @author Zed
 */
public interface GameLevel<S, A extends com.zed.api.games.Action> {

    /**
     * 所属游戏
     *
     * @return {@link Game}
     */
    Game getGame();

    /**
     * 当前关卡是否为开始
     *
     * @return {@link boolean}
     */
    default boolean isFirst() {
        return this.getParentLevel() == null;
    }

    /**
     * 当前关卡是否最后一个关卡
     *
     * @return {@link boolean}
     */
    default boolean isEnd() {
        return this.getNextLevel() == null;
    }

    /**
     * 下一个关卡
     *
     * @return {@link GameLevel}
     */
    GameLevel<S, A> getNextLevel();

    /**
     * 上一个关卡
     *
     * @return {@link GameLevel}
     */
    GameLevel<S, A> getParentLevel();

    /**
     * 当前关卡
     *
     * @return {@link int}
     */
    int getCurrentLevel();

    /**
     * 展示的世界
     *
     * @return {@link S}
     */
    S getShowWorld();

    /**
     * 按{@code Action}执行动作调用,类似在一个场景中游戏用户攻击
     *
     * @param action {@link A}
     * @return {@link }
     */
    ActionReply invoke(A action) throws GameException;

    /**
     * 所支持的动作
     *
     * @return {@link List}
     */
    List<Class<? extends A>> getSupportActions();
}
